﻿#pragma once

#include <QFileDialog>
#include <QInputDialog>
#include <QMessageBox>
#include <QMouseEvent>
#include <QResizeEvent>
#include <QTimer>
#include <QtWidgets/QMainWindow>

// 交互头文件
#include <AIS_PointCloud.hxx>
#include <AIS_Shape.hxx>
#include <AIS_Triangulation.hxx>

// 形状头文件
#include <TopoDS_Shape.hxx>

// 序列头文件
#include <TColGeom_HArray1OfCurve.hxx>
#include <TColGeom_HArray1OfSurface.hxx>
#include <TColStd_HSequenceOfTransient.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <TColgp_HSequenceOfPnt.hxx>
#include <TopTools_HSequenceOfShape.hxx>

#undef Handle

#include <occmesh/api/meshfit.h>

#define Handle(Class) opencascade::handle<Class>

#include <occmesh/api/filling.h>

namespace Ui
{
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

  public:
    friend class OCCWidget;

    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void AddPointCloud(const std::vector<gp_Pnt> &points); // 添加点云
    void AddCurve(Handle(Geom_Curve) curve, double first,
                  double last);                    // 添加曲线
    void AddSurface(Handle(Geom_Surface) surface); // 添加曲面
    void AddShape(const TopoDS_Shape &shape);      // 用于载入形状
    void AddMesh(MeshPtr mesh);                    // 用于载入三角网格

    void ReadSTP(const char *path);
    void WriteSTP(const char *path);
    void ReadIGS(const char *path);
    void WriteIGS(const char *path);
    void ReadBRep(const char *path);
    void WriteBRep(const char *path);
    void ReadCloud(const char *path);
    void WriteCloud(const char *path);
    void ReadMesh(const char *path);

    virtual void resizeEvent(QResizeEvent *event);

  public slots:
    void initializeChildren();

    void openFile();
    void openCloud();
    void openDirectory();
    void saveFile();
    void saveCloud();
    void saveSpecific();
    void deleteFile();

    void smoothShade();
    void flatShade();

    void meshFitting();
    void covering();
    void filling();

  private:
    Ui::MainWindow *ui;

    std::vector<TopoDS_Shape> m_selected;                   // 存放被选中的拓扑
    std::vector<TopoDS_Shape> m_shapes;                     // 存放拓扑形状
    std::vector<Handle(AIS_PointCloud)> m_clouds;           // 存放点云
    std::map<Handle(Poly_Triangulation), MeshPtr> m_meshes; // 存放三角网格
};
